package com.sky.module.system.role.controller;


import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.sky.module.system.permission.domain.dto.RolePermissionDTO;
import com.sky.module.system.permission.domain.vo.RolePermissionVo;
import com.sky.module.system.permission.service.PermissionService;
import com.sky.module.system.role.domain.entity.Role;
import com.sky.module.system.role.domain.vo.RoleQueryVo;
import com.sky.module.system.role.service.RoleService;
import com.sky.module.system.user.domain.entity.User;
import com.sky.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author zsg
 * @since 2023-02-20
 */
@RestController
@RequestMapping("/api/role")
public class RoleController {
    @Resource
    private RoleService roleService;

    @Autowired
    private PermissionService permissionService;

    /***
     * @description 查询角色列表
     * @param roleQueryVo
     * @return com.zsg.utils.Result
     * @date 2023/2/23 0:39
     *
     */
    @GetMapping("/list")
    public Result list(RoleQueryVo roleQueryVo) {
        IPage<Role> page = new Page<>(roleQueryVo.getPageNo(), roleQueryVo.getPageSize());
        IPage<Role> list = roleService.findRoleListByPage(page, roleQueryVo);

        return Result.ok(page);
    }

    /***
     * @description 添加角色
     * @param role
     * @return com.zsg.utils.Result
     * @date 2023/2/23 0:46
     *
     */
    @PostMapping("/add")
    public Result add(@RequestBody Role role) {
        User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        role.setCreateUser(user.getId());
//         调用添加方法 记录变更记录
        if (roleService.saveRole(role)) {
            return Result.ok().message("添加角色成功");
        }
        return Result.error().message("添加角色失败");
    }

    /***
     * @description 修改角色
     * @param role
     * @return com.zsg.utils.Result
     * @date 2023/2/23 0:51
     *
     */
    @PutMapping("/edit")
    public Result edit(@RequestBody Role role) {
//         调用添加方法
        if (roleService.updateRoleById(role)) {
            return Result.ok().message("修改角色成功");
        }
        return Result.error().message("修改角色失败");


    }

    /***
     * @description 删除角色
     * @param null
     * @return
     * @date 2023/2/23 0:51
     *
     */
    @DeleteMapping("/delete/{id}")
    public Result delete(@PathVariable("id") Long id) {
//      删除角色 判断角色是否被使用 还有就是角色下面是否有权限，有权限不能删除l
//        TODO 其实角色下有权限还好，主要是判断角色是否被用户使用者
//         1. 删除用户角色关系的 多对多的表
//         删除角色与权限菜单饿关系  多表多表
//
        if (roleService.removeByRoleId(id)) {
            return Result.ok().message("删除成功");
        }
        return Result.error().message("删除错误");
    }

    /***
     * @description 检查角色是否被用户使用
     * @param id Role_id
     * @return com.zsg.utils.Result
     * @date 2023/2/23 1:03
     *
     */
    @GetMapping("/check/{id}")
    public Result check(@PathVariable Long id) {
        if (roleService.hasRoleCount(id)) {
            return Result.exist().message("该角色已分配其他用户,无法删除");
        }
        return Result.ok();
    }

    /***
     * @description 分配权限菜单
     * @param roleId
     * @return com.zsg.utils.Result
     * @date 2023/2/23 11:42
     *
     */
    @GetMapping(value = "/getAssignPermissionTree")
    public Result getAssignPermissionTree(Long roleId) {
        User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        final RolePermissionVo permissionTree = permissionService.findPermissionTree(user.getId(), roleId);
        return Result.ok(permissionTree);
    }

    /***
     * @description 分配权限-保存角色权限数据
     * @param rolePermissionDTO
     * @return com.zsg.utils.Result
     * @date 2023/2/23 19:24
     *
     */
    @PostMapping("/saveRoleAssign")
    public Result saveRoleAssign(@RequestBody RolePermissionDTO rolePermissionDTO) {
        if (roleService.saveRolePermission(rolePermissionDTO.getRoleId(), rolePermissionDTO.getList())) {
            return Result.ok().message("权限分配成功");
        }
        return Result.error().message("权限分配失败");
    }


}

